#include "SchmidtCAM.h"

/*
    #define SPI_PS_ADC2REG_CLK  0
    #define SPI_PS_LT           1
    #define SPI_PS_RT           2
    #define SPI_PS_DCDS         3
    #define SPI_PS_DAISY        4
    #define SPI_PS_OS_ADDR      6
*/


void set_SPI_PS_A2( uint32_t* gpio_reg, uint32_t A2 ){
	if( A2 == 0 )
		clrbit(*gpio_reg, BIT_SPI_PS_A2);
	
	if( A2 == 1 )
		setbit(*gpio_reg, BIT_SPI_PS_A2);
}

void set_SPI_PS_A1( uint32_t* gpio_reg, uint32_t A1 ){
	if( A1 == 0 )
		clrbit(*gpio_reg, BIT_SPI_PS_A1);
	
	if( A1 == 1 )
		setbit(*gpio_reg, BIT_SPI_PS_A1);
}

void set_SPI_PS_A0( uint32_t* gpio_reg, uint32_t A0 ){
	if( A0 == 0 )
		clrbit(*gpio_reg, BIT_SPI_PS_A0);
	
	if( A0 == 1 )
		setbit(*gpio_reg, BIT_SPI_PS_A0);
}

/*
    根据输入的选项参数SPI_PS_OPT对AXI_GPIO中相应的bits进行设置
*/
void SPI_PS_MUX8( uint32_t *axi_gpio_reg, uint32_t SPI_PS_OPT ){
    
    uint32_t A2 = 0;
    uint32_t A1 = 0;
    uint32_t A0 = 0;
    
    switch (SPI_PS_OPT) {
    
        case SPI_PS_ADC2REG_CLK:    // 0,0,1
            A2 = 0;
            A1 = 0;
            A0 = 1;
            break;
            
        case SPI_PS_DAISY:          // 0,1,0
            A2 = 0;
            A1 = 1;
            A0 = 0;
            break;
            
        case SPI_PS_OS_ADDR:        // 0,1,1
            A2 = 0;
            A1 = 1;
            A0 = 1;
            break;

        default:    // 0,0,0
            A2 = 0;
            A1 = 0;
            A0 = 0;
    }

/*#ifdef _PRINT_DEBUG_INFO_*/
/*    char msg[1024];*/
/*    sprintf(msg, "A2 = %d, A1 = %d, A0 = %d", A2, A1, A0);*/
/*    printDebugInfo(msg);*/
/*#endif*/

    set_SPI_PS_A2(axi_gpio_reg, A2);
    set_SPI_PS_A1(axi_gpio_reg, A1);
    set_SPI_PS_A0(axi_gpio_reg, A0);
}

void SPI_PS_SCLK( uint32_t *axi_gpio_reg ){
	clrbit(*axi_gpio_reg, BIT_SPI_PS_SCLK);
    usleep(1);
	setbit(*axi_gpio_reg, BIT_SPI_PS_SCLK);
    usleep(1);
}

void SPI_PS_RST( uint32_t *axi_gpio_reg ){
	clrbit(*axi_gpio_reg, BIT_SPI_PS_RST);
    usleep(1);
	setbit(*axi_gpio_reg, BIT_SPI_PS_RST);
    usleep(1);
	clrbit(*axi_gpio_reg, BIT_SPI_PS_RST);
    usleep(1);
}

void SPI_PS_SEND_DATA(  uint32_t *axi_gpio_reg,
                        uint32_t *axi_gpio2_reg, 
                        uint32_t *reg_vals, 
                        uint32_t tx_num,
                        uint32_t SPI_PS_OPT ){

#if defined (_DEBUG_PS_SPI_)
    printf("> FILE: %s\n", __FILE__);
    printf("> Func: %s\n", __func__);
    printf("> LINE: %d\n", __LINE__);
    uint32_t A2 = get_bit(*axi_gpio_reg, BIT_SPI_A2);
    uint32_t A1 = get_bit(*axi_gpio_reg, BIT_SPI_A1);
    uint32_t A0 = get_bit(*axi_gpio_reg, BIT_SPI_A0);
    printf("A2 = %d, A1 = %d, A0 = %d\n", A2, A1, A0);
#endif

//  配置SPI-PS的"片选使能"信号
    SPI_PS_MUX8( axi_gpio_reg, SPI_PS_OPT );

    // set_SPI_DAISY( axi_gpio_reg, 1 );
    
	SPI_PS_RST(axi_gpio_reg);
	SPI_PS_SCLK(axi_gpio_reg);

    int i;
	for( i=0; i<tx_num; i++ ){
		*axi_gpio2_reg = reg_vals[i];   // 16 addr bits + 16 data bits
        // printf("## sending %u\n", reg_vals[i]);
		SPI_PS_SCLK(axi_gpio_reg);
	}
	
/*	SPI_PS_SCLK(axi_gpio_reg);*/
}
